注意:所有文章除特别说明外,转载请注明出处.
简介
该模式提供了评估语言的语法或表达式的方式。此模式实现了一个表达式接口,该接口解释一个特定的上下文。在编程中需要分析一件事情,并决定其含义所以需要解释器模式来完成。
此模式基于表达式和评估器部分。第一个代表要分析的事情,该分析是由评价者做出,它们知道构成表达的人物的意义。
为了解释一种语言而为语言创建的解释器。
场景
1. 某个特定类型问题发生频率足够高的时候
优点
1. 语法由很多类表示,容易改变和扩展此语言
缺点
1. 当语法规则数目太多时,增加了系统的复杂度
相关设计模式
1. 解释器模式和适配器模式
解释器模式
1.创建表达式接口(抽象表达式类)
public interface Expression {
    //解释方法
    public boolean interpret(String context);
}
2.创建实现上述接口的实体类(终结表达式类)
public class TerminalExpression implements Expression {
   private String data;
   public TerminalExpression(String data){
      this.data = data; 
   }
    //对终结表达式的处理
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}
public class OrExpression implements Expression {
   private Expression expr1 = null;
   private Expression expr2 = null;
   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) || expr2.interpret(context);
   }
}
public class AndExpression implements Expression {
   private Expression expr1 = null;
   private Expression expr2 = null;
   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) && expr2.interpret(context);
   }
}
3.InterpreterPatternDemo 使用 Expression 类来创建规则 并解析它们
public class InterpreterPatternDemo {
   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   }
   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   }
   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();
      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}
总结
解释器模式包含以下主要角色:
1.抽象表达式:定义解释器的接口,约定解释器的解释操作,主要包含方法:intercept()。
2.终结符表达式:抽象表达式的子类,实现文法中与终结符相关的操作。
3.非终结符表达式:抽象表达式的子类,用来实现文法中与非终结符相关的操作。
4.环境:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据。
5.客户端:验证正确与否
      
    